<!DOCTYPE html>
<html>
<head>
<link rel="icon" href="data:,">
<title>Make Reference</title>
<meta charset="utf-8"/>
	
<style>
h1 {font-size: 2em;}
h2 {font-size: 1.5em; margin-block-start: 0.0em; margin-block-end: 0.2em;}
h3 {font-size: 1.2em;}
p {font-size: 1em;}

input[type=number] {
	width: 100px;
	margin-right: 10px;
	padding: 3px 5px;
	display: inline-block;
	border: 1px solid #ccc;
	font-size: 16px; 
}

.button {
	padding: 5px 10px;
    width: 210px;
	font-size: 16px;
}

table {
	padding: 5px;
}
</style>

</head>

<body style="font-family: arial; padding: 0px 10px;">
    <h2>Create Reference out of Raw Image</h2>

	<table>
	  <tr>
		<td><input class="button" type="button" value="Show Actual Reference" onclick="showReference()"></td>	  
		<td><input class="button" type="button" value="Create New Reference" onclick="loadRawImage()"></td>
		<td><input class="button" type="submit" id="take" onclick="doTake()" value="Take Image"></td>
	  </tr> 
	  <tr>
		<td style="padding-top: 10px"><label for="mirror" id="labelmirror">Mirror Image:</label></td>
        <td style="padding-top: 10px"><input type="checkbox" id="mirror" name="mirror" value="1" onchange="drawRotated()"></td>
      </tr>
      <tr>

		<td><label for="flip" id="labelflip">Flip Image Size:</label></td>
        <td><input type="checkbox" id="flip" name="flip" value="1" onchange="drawRotated()"></td>
        
	  </tr>
	  <tr>
        <td><label for="mirror">Pre-rotate Angle:</label></td>	  
		<td><input type="number" id="prerotateangle" name="prerotateangle" value="0" min="-360" max="360" onchange="drawRotated()">Degrees</td>
        <td>
            <class id="MakeImage_Brightness_text" style="color:black;">Brightness: </class>
            <input type="number" id="MakeImage_Brightness_value1" size="13" value=0  min="-2" max="2" style="float: right; clear: both;">
        </td>
	  </tr>
	  <tr>
		<td><label for="mirror">Fine Alignment:</label></td>	
		<td><input type="number" id="finerotate" name="finerotate" value=0.0 min="-1" max="1" step="0.2" onchange="drawRotated()">Degrees</td>
<!-- 
        <td>
            <class id="MakeImage_Contrast_text" style="color:black;">Contrast</class>
            <input type="number" id="MakeImage_Contrast_value1" size="13" value=0  min="-2" max="2" style="float: right; clear: both;">
        </td>
        <td>
            <class id="MakeImage_Saturation_text" style="color:black;">Saturation</class>
            <input type="number" id="MakeImage_Saturation_value1" size="13" value=0   min="-2" max="2" style="float: right; clear: both;">
        </td>
-->
    </tr>
	</table>

	<table>
		<tr>			
			<td><canvas id="canvas"></canvas></td>
		</tr>			
		<tr>		
			<td><input class="button" type="button" id="updatereferenceimage" value="Update Reference Image" onclick="SaveReference()"></td>
		</tr>
	</table>


    <script type="text/javascript" src="./gethost.js"></script> 
    <script type="text/javascript" src="./readconfigcommon.js"></script>  
    <script type="text/javascript" src="./readconfigparam.js"></script>  
    
    

    <script language="JavaScript">
        var canvas = document.getElementById('canvas'),
            ctx = canvas.getContext('2d'),
            imageObj = new Image()
            basepath = "http://192.168.178.26";   
            isActReference = false;
            param;

        function doTake(){ 
            var xhttp = new XMLHttpRequest();
            if (param["MakeImage"]["Brightness"].found && param["MakeImage"]["Brightness"].enabled)
            {
                _brightness = document.getElementById("MakeImage_Brightness_value1").value;
//            _contrast = document.getElementById("MakeImage_Contrast_value1").value;
//            _saturation = document.getElementById("MakeImage_Saturation_value1").value;
            url = basepath + "/editflow.html?task=test_take&bri=" + _brightness;
            }
            else
            {
                url = basepath + "/editflow.html?task=test_take";
            }
            if (basepath.length > 0){
                url = url + "&host=" + basepath;
            }
            xhttp.open("GET", url, false);
            xhttp.send();
            loadRawImage();
        }
            
        function loadRawImage(){
            url = basepath + "/img_tmp/raw.jpg" + "?session=" + Math.floor((Math.random() * 1000000) + 1);
            document.getElementById("finerotate").disabled = false;
            document.getElementById("prerotateangle").disabled = false;  
            document.getElementById("updatereferenceimage").disabled = false;
            document.getElementById("take").disabled = false;
            if (param["Alignment"]["InitialMirror"].found)
                document.getElementById("mirror").disabled = false;
            else
            {
                document.getElementById("labelmirror").style = "color:lightgrey;";
            }

            if (param["Alignment"]["FlipImageSize"].found)
                document.getElementById("flip").disabled = false;
            else
            {
                document.getElementById("labelflip").style = "color:lightgrey;";
            }

            if (param["MakeImage"]["Brightness"].found && param["MakeImage"]["Brightness"].enabled)
                document.getElementById("MakeImage_Brightness_value1").disabled = false;
            else
            {
                document.getElementById("MakeImage_Brightness_value1").type = "hidden";
                document.getElementById("MakeImage_Brightness_text").style.visibility = "hidden";
                
            }

//            if (param["MakeImage"]["Saturation"].found)
//                document.getElementById("MakeImage_Saturation_value1").disabled = false;
//            if (param["MakeImage"]["Contrast"].found)
//                document.getElementById("MakeImage_Contrast_value1").disabled = false;

            isActReference = false;
            loadCanvas(url);  
            drawRotated();          
        }    

        function showReference(_param){
            url = basepath + "/fileserver/config/reference.jpg" + "?session=" + Math.floor((Math.random() * 1000000) + 1);;
            document.getElementById("finerotate").value = 0;
            document.getElementById("prerotateangle").value = _param["Alignment"]["InitialRotate"].value1;

            if (_param["Alignment"]["InitialMirror"].found && (_param["Alignment"]["InitialMirror"].value1 == "true"))
                document.getElementById("mirror").checked = true;

            if (_param["Alignment"]["FlipImageSize"].found && (_param["Alignment"]["FlipImageSize"].value1 == "true"))
                document.getElementById("flip").checked = true;

            document.getElementById("finerotate").disabled = true;
            document.getElementById("prerotateangle").disabled = true; 
            document.getElementById("updatereferenceimage").disabled = true;
            document.getElementById("take").disabled = true;
            document.getElementById("MakeImage_Brightness_value1").disabled = true;
//            document.getElementById("MakeImage_Saturation_value1").disabled = true;
//            document.getElementById("MakeImage_Contrast_value1").disabled = true;
            document.getElementById("mirror").disabled = false;
            document.getElementById("flip").disabled = false;
            if (!(param["MakeImage"]["Brightness"].found))
            {
                document.getElementById("MakeImage_Brightness_value1").type = "hidden";
                document.getElementById("MakeImage_Brightness_text").style.visibility = "hidden";
            }


            document.getElementById("mirror").disabled = true;
            document.getElementById("flip").disabled = true;

            isActReference = true;                                  
            loadCanvas(url);
            drawRotated(false, true);
        }
            
        function dataURLtoBlob(dataurl) {
            var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
                bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
            while(n--){
                u8arr[n] = bstr.charCodeAt(n);
            }
            return new Blob([u8arr], {type:mime});
        }			
                
        function SaveReference(){
            if (confirm("Are you sure you want to update the reference image?")) {
                param["Alignment"]["InitialRotate"].value1 = document.getElementById("prerotateangle").value;

                if ((param["Alignment"]["InitialMirror"].found == true) && (document.getElementById("mirror").checked))
                {
                    param["Alignment"]["InitialMirror"].value1 = "true";
                    param["Alignment"]["InitialMirror"]["found"] = true;
                    param["Alignment"]["InitialMirror"]["enabled"] = true;
                }
                else
                    param["Alignment"]["InitialMirror"].value1 = "false";

                if ((param["Alignment"]["FlipImageSize"].found == true) && (document.getElementById("flip").checked))
                    param["Alignment"]["FlipImageSize"].value1 = "true";
                else
                    param["Alignment"]["FlipImageSize"].value1 = "false";

                if (param["MakeImage"]["Brightness"].found && param["MakeImage"]["Brightness"].enabled)
                {
                    ReadParameter(param, "MakeImage", "Brightness", false);		
    //            	ReadParameter(param, "MakeImage", "Contrast", false);
    //                ReadParameter(param, "MakeImage", "Saturation", false);
                }

                var canvas = document.getElementById("canvas");
                drawRotated(false);

                WriteConfigININew();
                SaveConfigToServer(basepath);    

                SaveCanvasToImage(canvas, "/config/reference.jpg", true, basepath);
                showReference();
                UpdatePage();
            }
        }

        function loadCanvas(dataURL) {
                var canvas = document.getElementById('canvas');
                var context = canvas.getContext('2d');

                imageObj.onload = function() {
                    canvas.width = this.width;
                    canvas.height = this.height;
                    drawRotated();
                };

                imageObj.src = dataURL;
            }


        function getCoords(elem) { // crossbrowser version
            var box = elem.getBoundingClientRect();
            var body = document.body;
            var docEl = document.documentElement;
            var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
            var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;
            var clientTop = docEl.clientTop || body.clientTop || 0;
            var clientLeft = docEl.clientLeft || body.clientLeft || 0;
            var top  = box.top +  scrollTop - clientTop;
            var left = box.left + scrollLeft - clientLeft;
            return { top: Math.round(top), left: Math.round(left) };
        }

        function init() {
            canvas.addEventListener('mousemove', mouseMove, false);    
            basepath = getbasepath();  
            loadConfig(basepath); 
            ParseConfig();
            param = getConfigParameters();
            UpdateInput();
            showReference(param); 
        }

        function UpdateInput() {
            WriteParameter(param, category, "MakeImage", "Brightness", false);		
//            WriteParameter(param, category, "MakeImage", "Contrast", false);		
//            WriteParameter(param, category, "MakeImage", "Saturation", false);		
        }


        function ReadParameter(_param, _cat, _name, _optional, _select = false){
            if (_param[_cat][_name]["found"]){
                if (_optional) {
                    _param[_cat][_name]["enabled"] = document.getElementById(_cat+"_"+_name+"_enabled").checked;			
                }
                if (_select) {
                    var sel = document.getElementById(_cat+"_"+_name+"_value1");
                    _param[_cat][_name]["value1"] = sel.options[sel.selectedIndex].text;
                }
                else {
                    for (var j = 1; j <= _param[_cat][_name]["anzParam"]; ++j) {
                        _param[_cat][_name]["value"+j] = document.getElementById(_cat+"_"+_name+"_value"+j).value;
                    }
                }
            }
        }
        

        function WriteParameter(_param, _category, _cat, _name, _optional, _select = false, _anzpara = 1){
            if (_param[_cat][_name]["found"]){
                if (_optional) {
                    document.getElementById(_cat+"_"+_name+"_enabled").checked = _param[_cat][_name]["enabled"];
                    for (var j = 1; j <= _anzpara; ++j) {
                        document.getElementById(_cat+"_"+_name+"_value"+j).disabled = !_param[_cat][_name]["enabled"];	
                    }		
                }
                document.getElementById(_cat+"_"+_name+"_text").style="color:black;"
                if (_select) {
                    var textToFind = _param[_cat][_name]["value1"];
                    var dd = document.getElementById(_cat+"_"+_name+"_value1");
                    for (var i = 0; i < dd.options.length; i++) {
                        if (dd.options[i].text.toLowerCase() === textToFind.toLowerCase()) {
                            dd.selectedIndex = i;
                            break;
                        }
                    }
                }
                else {
                    for (var j = 1; j <= _anzpara; ++j) {
                        document.getElementById(_cat+"_"+_name+"_value"+j).value = _param[_cat][_name]["value"+j];
                    }
                }

            }
            else {
                if (_optional) {
                    document.getElementById(_cat+"_"+_name+"_enabled").disabled = true;	
                    for (var j = 1; j <= _anzpara; ++j) {
                        document.getElementById(_cat+"_"+_name+"_value"+j).disabled = true;	
                    }	
                }
                document.getElementById(_cat+"_"+_name+"_text").style="color:lightgrey;"		
            }
        }


        function drawRotated(_grid = true, _isreference = false){
            finerot= parseFloat(document.getElementById("finerotate").value);
            prerot = parseFloat(document.getElementById("prerotateangle").value);
            mirror = document.getElementById("mirror").checked;
            flip = document.getElementById("flip").checked;

            if (finerot == 1) {
                prerot+=1
                finerot = 0
            }
            if (finerot == -1) {
                prerot-=1
                finerot = 0
            }
            degrees = finerot + prerot;
            document.getElementById("finerotate").value =  finerot;
            document.getElementById("prerotateangle").value =  prerot;

            var canvas = document.getElementById('canvas');
            if (flip == 1)
            {
                canvas.width = imageObj.height;
                canvas.height = imageObj.width;
            }
            else
            {
                canvas.width = imageObj.width;
                canvas.height = imageObj.height;
            }

            var canvas = document.getElementById('canvas');
            var context = canvas.getContext('2d');

            context.clearRect(0,0,canvas.width,canvas.height);
            context.save();

            if (isActReference)
            {
                context.drawImage(imageObj,0,0);
            }
            else
            {
                context.translate(canvas.width/2,canvas.height/2);
                context.rotate(degrees*Math.PI/180);
                if (mirror) {
                    context.scale(-1, 1);
                }
                context.drawImage(imageObj,-imageObj.width/2,-imageObj.height/2);
            }
            
            
            context.restore();
            if (_grid == true && !isActReference){
                drawGrid();
            }

        }

        function drawGrid(){
            var canvas = document.getElementById('canvas');
            var ctx = canvas.getContext('2d');
            w = canvas.width;
            h = canvas.height;
            ctx.save();
            ctx.strokeStyle = '#00FF00';

            for (i = h/2; i < h; i += 100) 
                {
                ctx.moveTo(0, i);
                ctx.lineTo(w, i);
                ctx.stroke();
                ctx.moveTo(0, h-i);
                ctx.lineTo(w, h-i);
                ctx.stroke();
                }
            for (i = w/2; i < w; i += 100) 
                {
                ctx.moveTo(i, 0);
                ctx.lineTo(i, h);
                ctx.stroke();
                ctx.moveTo(w-i, 0);
                ctx.lineTo(w-i, h);
                ctx.stroke();                }
            ctx.restore();
        }

        function mouseMove(e) {
            drawRotated();
            var canvas = document.getElementById('canvas');
            var context = canvas.getContext('2d');

            zw = getCoords(this);
            x = e.pageX - zw.left;
            y = e.pageY - zw.top;
            
            context.lineWidth = 2;
            context.strokeStyle = "#00FF00";
            context.beginPath(); 
            context.moveTo(0,y);
            context.lineTo(canvas.width, y);
            context.moveTo(x, 0);
            context.lineTo(x, canvas.height);
            context.stroke();            
        }


        init();
    </script>

</body>
</html>